今天的學習是 Scope & Closure Ch.5 Re-declaration
主要討論 var let const
宣告的變數與 re-declaration 的關聯。
重點提醒:
var: function scope
let, const: block scope
var myName = 'Frank';
console.log(myName); // Frank
var myName;
console.log(myName); // Frank
上面的 snippet,myName
在同個 scope 裡出現兩次宣告,第二次的宣告會被視作無意義的宣告。
我們看看上面的 snippet 在 hoisting 時會像什麼情況
var myName;
var myName;
myName = 'Frank';
console.log(myName);
console.log(myName);
宣告變數的部分,會被提升至 scope 的最上方。
var greeting;
function greeting() {
console.log('Hello');
}
var greeting;
typeof greeting; // "function"
var greeting = 'Hello';
typeof greeting; // "string"
let studentName = "Frank";
console.log(studentName);
let studentName = "Gigi"; // Uncaught SyntaxError: Identifier 'studentName' has already been declared
var studentName = "Frank";
console.log(studentName);
let studentName = "Gigi"; // Uncaught SyntaxError: Identifier 'studentName' has already been declared
const empty; // SyntaxError: Missing initializer in const declaration
SyntaxError
代表在程式開始執行之前,就有的問題。
const myAge = 23;
console.log(myAge); // 23
myAge = 25; // TypeError: Assignment to constant variable.
TypeError
代表 operation 不能被執行,因為 myAge 的 type 是 constant,constant 不能執行 re-assignment。
有了上面兩個 Error,我們知道 constant 在宣告時,因為一定要 assignment 且不能 re-assignment,所以 constant 不允許 re-declare。
明天要討論 Loops 裡的變數宣告,屬於 re-declaration 嗎?